//
//  ViewController.m
//  Effective Objective-C 2.0
//
//  Created by 周成龙 on 2017/10/10.
//  Copyright © 2017年 周成龙. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, copy) NSArray *datas;

@end

static NSString *const ID = @"cell";
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.title = @"Effective Objective-C 2.0";
    self.tableView.estimatedRowHeight = 44;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
    
    self.datas = @[
  @{@"title": @"熟悉Objective-C", @"content": @[
        @{@"title": @"OC起源", @"clsName": @"OriginViewController"},
        @{@"title": @"少引用其他头文件", @"clsName": @"OriginViewController"},
        @{@"title": @"多用字面量,少用与之等价的方法", @"clsName": @"OriginViewController"},
        @{@"title": @"多用类型常量，少用#define预处理指令", @"clsName": @"OriginViewController"},
        @{@"title": @"用枚举表示状态，选项，状态吗", @"clsName": @"OriginViewController"}
        ]},
  @{@"title": @"对象、消息、运行期", @"content": @[
        @{@"title": @"理解属性概念", @"clsName": @"PropertyViewController"},
        @{@"title": @"在对象内部尽量直接访问实例变量", @"clsName": @"PropertyViewController"},
        @{@"title": @"对象等同性", @"clsName": @"EqualViewController"},
        @{@"title": @"类族模式，隐藏实现细节", @"clsName": @"ClassClusterViewController"},
        @{@"title": @"在既有类中使用关联对象存放自定义数据", @"clsName": @"AssociatedObjectViewController"},
        @{@"title": @"objc_msgSend作用", @"clsName": @"MsgSendViewController"},
        @{@"title": @"消息转发机制", @"clsName": @"MessageForwardingViewController"},
        @{@"title": @"用'方法调配技术'调试'黑盒方法'", @"clsName": @"ExchangeImplementViewController"},
        @{@"title": @"类对象的用意", @"clsName": @"ClassMeaningViewController"}
        ]},
  @{@"title": @"接口与API设计", @"content": @[
        @{@"title": @"用前缀避免命名空间冲突", @"clsName": @"PrefixViewController"},
        @{@"title": @"提供'全能初始化方法'", @"clsName": @"DesignatedInitializerViewController"},
        @{@"title": @"实现descreption方法", @"clsName": @"DescriptionViewController"},
        @{@"title": @"尽量不使用可变对象", @"clsName": @""},
        @{@"title": @"使用清晰而协调的的命名方式", @"clsName": @""},
        @{@"title": @"为私有方法名加前缀", @"clsName": @""},
        @{@"title": @"理解Object-C错误模型", @"clsName": @"ErrorExceptionViewController"},
        @{@"title": @"理解NSCoping", @"clsName": @"CopingViewController"}
        ]},
  @{@"title": @"协议与分类", @"content": @[
        @{@"title": @"通过委托与数据源协议进行对象间的通信", @"clsName": @"ProtocolViewController"},
        @{@"title": @"将类的实现代码分散到便于管理的数个分类之中", @"clsName": @"CategoryViewController"},
        @{@"title": @"总是为第三方的分类名名称加前缀", @"clsName": @""},
        @{@"title": @"勿在分类中声明属性", @"clsName": @"CategoryPropertyViewController"},
        @{@"title": @"使用class-continuation分类隐藏实现细节", @"clsName": @""},
        @{@"title": @"通过协议提供匿名对象", @"clsName": @"AnonymityObjectViewController"}
        ]},
  @{@"title": @"内存管理", @"content": @[
            @{@"title": @"理解引用计数", @"clsName": @"MRCViewController"},
            @{@"title": @"以ARC简化引用计数", @"clsName": @""},
            @{@"title": @"在dealloc方法中只释放引用计数并解除监听", @"clsName": @""},
            @{@"title": @"编写‘异常安全代码’时，留意内存管理问题", @"clsName": @"ARCViewController"},
            @{@"title": @"以弱引用避免保留环", @"clsName": @""},
            @{@"title": @"以‘自动释放池块’降低内存峰值", @"clsName": @""},
            @{@"title": @"用‘将是对象’调试内存管理问题", @"clsName": @""},
            @{@"title": @"不要使用retainCount", @"clsName": @""}
            ]},
  @{@"title": @"块与打中枢派发", @"content": @[
            @{@"title": @"理解‘块’这个概念", @"clsName": @""},
            @{@"title": @"为常用的块类型创建typedef", @"clsName": @""},
            @{@"title": @"用handle块降低代码分散", @"clsName": @""},
            @{@"title": @"用块引用其所属对象时不要出现保留环", @"clsName": @""},
            @{@"title": @"多用派发队列，少用同步锁", @"clsName": @""},
            @{@"title": @"多用GCD，少用performSelector系列方法", @"clsName": @""},
            @{@"title": @"掌握GCD及操作队列的使用时机", @"clsName": @""},
            @{@"title": @"通过Dispatch Group机制，根据系统资源状况来执行任务", @"clsName": @""},
            @{@"title": @"只用dispatch_once来执行只需要运行一次的线程安全代码", @"clsName": @""},
            @{@"title": @"不要使用dispatch_get_current_queue", @"clsName": @""}
            ]},
  @{@"title": @"系统框架", @"content": @[
            @{@"title": @"熟悉系统框架", @"clsName": @""},
            @{@"title": @"多用块枚举，少用for循环", @"clsName": @"SystemFoundationViewController"},
            @{@"title": @"对自定义其内存管理语义的collection使用无缝桥接", @"clsName": @""},
            @{@"title": @"构建缓存是选用NSCache而非NSDictionary", @"clsName": @""},
            @{@"title": @"精简initialize与load的实现代码", @"clsName": @""},
            @{@"title": @"别忘了NSTimer会保留其目标对象", @"clsName": @""}
            ]}
  ];
    
    [self.tableView reloadData];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [self.datas count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSArray *array = self.datas[section][@"content"];
    return [array count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID forIndexPath:indexPath];
    cell.textLabel.numberOfLines = 0;
    
    NSArray *array = self.datas[indexPath.section][@"content"];
    cell.textLabel.text = array[indexPath.row][@"title"];
    
    return cell;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return self.datas[section][@"title"];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    NSArray *array = self.datas[indexPath.section][@"content"];
    Class cls = NSClassFromString(array[indexPath.row][@"clsName"]);
    UIViewController *vc = [cls new];
    vc.title = array[indexPath.row][@"title"];
    vc.view.backgroundColor = [UIColor whiteColor];
    [self.navigationController pushViewController:vc animated:YES];
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.0001;
}

@end
